<?php

namespace Database\Seeders;

use App\Models\User;
use App\Models\UserAddress;
use App\Models\Province;
use App\Models\City;
use App\Models\District;
use Illuminate\Database\Seeder;

class UserAddressSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        $users = User::all();
        
        if ($users->isEmpty()) {
            $this->command->warn('⚠️  没有找到用户，跳过地址创建');
            return;
        }

        // 检查省市区数据是否存在，只获取有区县数据的城市
        $cities = City::active()->whereHas('districts', function($query) {
            $query->where('is_active', true);
        })->with('province')->get();
        
        if ($cities->isEmpty()) {
            $this->command->warn('⚠️  没有找到有区县数据的城市，请先运行 ProvinceSeeder、CitySeeder 和 DistrictSeeder');
            return;
        }
        
        $this->command->info('📋 找到 ' . $cities->count() . ' 个有区县数据的城市');

        // 为每个用户创建 1-3 个地址
        $totalAddresses = 0;
        foreach ($users as $user) {
            $addressCount = rand(1, 3);
            $userAddresses = 0;
            
            for ($i = 0; $i < $addressCount; $i++) {
                // 随机选择一个有区县数据的城市
                $city = $cities->random();
                $province = $city->province;
                
                // 获取该城市下的区县
                $districts = $city->districts()->active()->get();
                if ($districts->isEmpty()) {
                    $this->command->warn("⚠️  城市 {$city->name} 没有区县数据，跳过");
                    continue;
                }
                
                // 随机选择一个区县
                $district = $districts->random();
                
                UserAddress::create([
                    'user_id' => $user->id,
                    'name' => $this->getRandomName($i),
                    'phone' => $this->getRandomPhone(),
                    'province' => $province->name,
                    'city' => $city->name,
                    'district' => $district->name,
                    'address' => $this->getRandomAddress(),
                    'postal_code' => $this->getRandomPostalCode(),
                    'is_default' => $i === 0, // 第一个地址设为默认
                    'label' => $this->getRandomLabel($i),
                    'last_used_at' => $i === 0 ? now() : null, // 默认地址设为最近使用
                ]);
                
                $userAddresses++;
                $totalAddresses++;
            }
            
            $this->command->info("👤 为用户 {$user->name} 创建了 {$userAddresses} 个地址");
        }

        $this->command->info('✅ 总共创建了 ' . $totalAddresses . ' 个用户地址');
    }

    private function getRandomName(int $index): string
    {
        $names = ['张三', '李四', '王五', '赵六', '刘七'];
        $suffixes = ['', '（公司）', '（家）', '（学校）'];
        
        return $names[array_rand($names)] . ($index > 0 ? $suffixes[array_rand($suffixes)] : '');
    }

    private function getRandomPhone(): string
    {
        $prefixes = ['138', '139', '136', '137', '150', '151', '188', '186'];
        return $prefixes[array_rand($prefixes)] . rand(10000000, 99999999);
    }

    private function getRandomLabel(int $index): ?string
    {
        if ($index === 0) {
            return null; // 默认地址不设置标签
        }
        
        $labels = ['家', '公司', '学校', '父母家', '朋友家'];
        return $labels[array_rand($labels)];
    }

    private function getRandomAddress(): string
    {
        $streets = [
            '三里屯SOHO 5号楼 1008室',
            '陆家嘴环路1000号 恒生银行大厦 20楼',
            '科技园南区 高新南七道 R2-B栋 5楼',
            '天府广场东侧 IFS国际金融中心 38楼',
            '文一西路 阿里巴巴西溪园区 10号楼',
            '中关村大街1号 理想国际大厦 15层',
            '淮海中路999号 环贸广场 2座 2201室',
            '珠江新城花城大道 东塔 66楼',
        ];

        return $streets[array_rand($streets)];
    }

    private function getRandomPostalCode(): string
    {
        return (string) rand(100000, 999999);
    }
}
